﻿
using System.Collections.Generic;
using ControlAcceso.Dominio;
using System;

namespace ControlAcceso.Persistencia
{
    public class ClienteMock : IClienteDao
    {
        private static ClienteMock singletonInstance;
        private ISet<Cliente> clientes;

        public static ClienteMock getInstance()
        {
            if (singletonInstance == null) singletonInstance = new ClienteMock();
            return singletonInstance;
        }

        private ClienteMock()
        {
            this.clientes = new HashSet<Cliente>();
            this.clientes.Add(new Cliente("Fran", "Gaitan", 35543198, "Degoy 123", "(0351) 4658210", "frangaitt@gmail.com", "Soy gordaso"));
            this.clientes.Add(new Cliente("Maria", "Saadi", 30543198, "Santa Ana 123", "(0223) 4658210", "tumama@hotmail.com", null));
            this.clientes.Add(new Cliente("La", "Jessi", 99999999, "Villa Nylon 666", "156123123", "palitodulce@live.com.ar", null));
            this.clientes.Add(new Cliente("Franchesco", "Gait", 35543144, "Degoy 123", "(0351) 4658210", "frangaitt@gmail.com", "Soy gordaso"));
            this.clientes.Add(new Cliente("Maria", "Paz", 30543198, "Santa Ana 123", "(0223) 4658210", "tumama@hotmail.com", null));
            this.clientes.Add(new Cliente("Esta", "Jessi", 99999999, "Villa Nylon 666", "156123123", "palitodulce@live.com.ar", null));
        
        }

        public ISet<Cliente> getTodosClientesEnSet()
        {
            return clientes;
        }

        public IList<Cliente> getTodosClientesEnList()
        {
            return new List<Cliente>(clientes);
        }

        public Cliente guardarOModificarCliente(Cliente clienteAGuardar)
        {
            Cliente clienteExistente = null;

            operation<Cliente, bool> buscarSiExiste = unCliente => unCliente.Equals(clienteAGuardar);
           
            foreach (Cliente unCliente in clientes)
            {
                if (buscarSiExiste(unCliente))
                {
                    clienteExistente = unCliente;
                    break;
                }
            }

            if (clienteExistente != null)
            {
                clientes.Remove(clienteExistente);
                clientes.Add(clienteAGuardar);
            }

            clientes.Add(clienteAGuardar);
            return clienteExistente;
        }

        public ISet<Cliente> getClientePorNombreOApellido(string nombreABuscar, string apellidoABuscar)
        {
            if (String.IsNullOrEmpty(nombreABuscar) && String.IsNullOrEmpty(apellidoABuscar)) throw new ArgumentNullException("Al menos el nombre o el apellido debe ser texto válido");

            ISet<Cliente> clientesEncontrados = new HashSet<Cliente>();

            foreach (Dominio.Cliente unCliente in this.clientes)
            {
                if(unCliente.Nombres.ToLower().Contains(nombreABuscar.ToLower()) || unCliente.Apellido.ToLower().Contains(apellidoABuscar.ToLower())) 
                    clientesEncontrados.Add(unCliente);

                //if (nombreABuscar != "" && apellidoABuscar != "")
                //{
                //    if (unCliente.Apellido.Equals(apellidoABuscar, StringComparison.OrdinalIgnoreCase) && unCliente.Nombres.Equals(nombreABuscar, StringComparison.OrdinalIgnoreCase))
                //        clientesEncontrados.Add(unCliente);
                //}
                //else
                //{
                //    if (nombreABuscar != "")
                //    {
                //        if (unCliente.Nombres.Equals(nombreABuscar, StringComparison.OrdinalIgnoreCase))
                //            clientesEncontrados.Add(unCliente);
                //    }
                //    else
                //    {
                //        if (unCliente.Apellido.Equals(apellidoABuscar, StringComparison.OrdinalIgnoreCase))
                //            clientesEncontrados.Add(unCliente);
                //    }
                //}
            }
            return clientesEncontrados;
        }

        public Cliente getClientePorDocumento(int documentoABuscar)
        {
            foreach (Cliente unCliente in this.clientes)
            {
                if (unCliente.Documento.Equals(documentoABuscar)) return unCliente;
            }
            return null;
        }

        public void eliminarCliente(int documentoDelClienteAEliminar)
        {
            Cliente clienteAEliminar = getClientePorDocumento(documentoDelClienteAEliminar);
            if (clienteAEliminar != null) clientes.Remove(clienteAEliminar);
        }

    }
}
